package models.vo {

  import com.axon.base.helpers.AxUtils;

  import helpers.Constants;

  import mx.collections.ArrayCollection;
  import mx.formatters.NumberFormatter;
  import mx.utils.ObjectProxy;

  import org.restfulx.collections.ModelsCollection;
  import org.restfulx.models.RxModel;

  [Resource(name="produtos")]

  [Bindable]
  public class Produto extends RxModel {

    public static const LABEL:String = "descricao";

    public var descricao:String;

    public var descricaoAnalista:String;

    public var obsVistoria:String;

    public var direitoNegado:Boolean;

    public var analiseDireito:String;

    public var enquadramento:String;

    public var capacidadeRealInstalada:int;

    public var capacidadeRealInstaladaAnterior:int;

    public var producaoEfetivaAnual:int;

    public var dataOperacional:Date;

    public var detalhesProducaoFxml:String;

    [BelongsTo]
    public var atividade:Atividade;

    [BelongsTo]
    public var setorEconomico:SetorEconomico;

    [BelongsTo]
    public var unidadeMedida:UnidadeMedida;

    [HasMany]
    public var producoes:ModelsCollection;

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function Produto() {
      super(LABEL);
    }

    [Ignored]
    public var condicaoAtendida:Boolean;

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getSetorEconomico():SetorEconomico {
      if (!setorEconomico)
        setorEconomico = new SetorEconomico();

      return setorEconomico;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getUnidadeMedida():UnidadeMedida {
      if (!unidadeMedida)
        unidadeMedida = new UnidadeMedida();

      return unidadeMedida;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getProducoes():ModelsCollection {
      if (!producoes)
        producoes = new ModelsCollection();

      return producoes;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getDescricaoAnalista():String {
      return (descricaoAnalista != "") ? descricaoAnalista : descricao;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function anosComProducao():Array {
      var collection:ModelsCollection = getProducoes();
      var result:Array = new Array();

      for each (var producao:Producao in collection) {

        if (result.indexOf(producao.ano) == -1)
          result.push(producao.ano);
      }

      return result.sort(Array.DESCENDING);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getAnoProducaoString(indice:int):String {
      var anos:Array = anosComProducao();

      return (indice <= anos.length) ? anos[indice - 1] : "";
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getProducaoViewArrayCollection():ArrayCollection {
      var lblProd:String = "Produção (" + unidadeMedida.nome + ")";
      var lblAval:String = "Avaliação";

      var result:ArrayCollection = new ArrayCollection(
        [
        {secao: lblProd, order: 1, col1: "Janeiro", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 2, col1: "Fevereiro", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 3, col1: "Março", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 4, col1: "Abril", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 5, col1: "Maio", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 6, col1: "Junho", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 7, col1: "Julho", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 8, col1: "Agosto", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 9, col1: "Setembro", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 10, col1: "Outubro", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 11, col1: "Novembro", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblProd, order: 12, col1: "Dezembro", col2: "", col3: "", col4: "", col5: "", col6: ""},

        {secao: lblAval, order: 13, col1: "Produção Efetiva", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblAval, order: 14, col1: "Índice (%)", col2: "", col3: "", col4: "", col5: "", col6: ""},
        {secao: lblAval, order: 15, col1: "Avaliação", col2: "", col3: "", col4: "", col5: "", col6: ""}
        ]);

      var prodFormatter:NumberFormatter = new NumberFormatter();
      var indiceFormatter:NumberFormatter = new NumberFormatter();
      var collection:ModelsCollection = getProducoes();
      var anos:Array = anosComProducao();
      var ind:int;
      var nomeColuna:String;
      var objAvaliacao:Object;
      var acAvaliacao:ArrayCollection;
      var atende:Boolean;

      prodFormatter.thousandsSeparatorTo = "."
      prodFormatter.decimalSeparatorTo = ",";
      prodFormatter.precision = -1;
      prodFormatter.rounding = "none";
      prodFormatter.useThousandsSeparator = true;

      indiceFormatter.thousandsSeparatorTo = "."
      indiceFormatter.decimalSeparatorTo = ",";
      indiceFormatter.precision = 4;
      indiceFormatter.rounding = "none";
      indiceFormatter.useThousandsSeparator = true;

      for each (var producao:Producao in collection) {

        ind = producao.mes - 1;

        switch (producao.ano) {

          case anos[0]:
            nomeColuna = "col2";
            break;
          case anos[1]:
            nomeColuna = "col3";
            break;
          case anos[2]:
            nomeColuna = "col4";
            break;
          case anos[3]:
            nomeColuna = "col5";
            break;
          case anos[4]:
            nomeColuna = "col6";
            break;
        }

        result[ind][nomeColuna] = prodFormatter.format(producao.quantidadeProduzida);
      }

      objAvaliacao = producaoPorAnoObject();
      acAvaliacao = new ArrayCollection();

      if (objAvaliacao) {

        if (objAvaliacao.records.record is ObjectProxy) {

          acAvaliacao.addItem(objAvaliacao.records.record);
        }

        else if (objAvaliacao.records.record is ArrayCollection) {

          acAvaliacao = ArrayCollection(objAvaliacao.records.record);
        }
      }

      atende = false;

      for (var i:int = 0; i < acAvaliacao.length; i++) {

        switch (acAvaliacao[i].ano.value) {

          case anos[0].toString():
            nomeColuna = "col2";
            break;
          case anos[1].toString():
            nomeColuna = "col3";
            break;
          case anos[2].toString():
            nomeColuna = "col4";
            break;
          case anos[3].toString():
            nomeColuna = "col5";
            break;
          case anos[4].toString():
            nomeColuna = "col6";
            break;
        }

        result[12][nomeColuna] = prodFormatter.format(parseInt(acAvaliacao[i].producao_efetiva.value));
        result[13][nomeColuna] = indiceFormatter.format(parseFloat(acAvaliacao[i].indice.value));
        result[14][nomeColuna] = (acAvaliacao[i].alcancado.value == "true") ? Constants.AVALIACAO_ATENDE : Constants.AVALIACAO_NAO_ATENDE;

        if (acAvaliacao[i].alcancado.value == "true")
          atende = true;
      }

      result[12]["secao"] = "Avaliação (" + (atende ? Constants.AVALIACAO_ATENDE : Constants.AVALIACAO_NAO_ATENDE) + ")";
      result[13]["secao"] = result[12]["secao"];
      result[14]["secao"] = result[12]["secao"];

      return result;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function producaoPorAnoObject():Object {
      var patternLt:RegExp = /¨@¨/gi;
      var patternGt:RegExp = /¨#¨/gi;
      var xmlString:String = detalhesProducaoFxml.replace(patternLt, "<").replace(patternGt, ">");

      return AxUtils.xmlToObject(new XML(xmlString));
    }

  }
}
